Exercise 3

In [1]:
# Import libraries
import cv2
import os
import numpy as np
import matplotlib.pyplot as plt
from math import sqrt

IN_COLAB = False
try:
    import google.colab
    IN_COLAB = True
except:
    IN_COLAB = False

if IN_COLAB:
    if not os.path.exists('images'):
        os.makedirs('images')
  
    !wget -P images/ "https://raw.githubusercontent.com/Vinihcampos/dim0451_DIP/master/Exercise%233/images/cat.jpg"
    !wget -P images/ "https://raw.githubusercontent.com/Vinihcampos/dim0451_DIP/master/Exercise%233/images/dog.jpg"
    !wget -P images/ "https://raw.githubusercontent.com/Vinihcampos/dim0451_DIP/master/Exercise%233/images/hillary.jpg"
    !wget -P images/ "https://raw.githubusercontent.com/Vinihcampos/dim0451_DIP/master/Exercise%233/images/pikachu.jpg"
    !wget -P images/ "https://raw.githubusercontent.com/Vinihcampos/dim0451_DIP/master/Exercise%233/images/raichu.png"
    !wget -P images/ "https://raw.githubusercontent.com/Vinihcampos/dim0451_DIP/master/Exercise%233/images/ted.jpg"
    !wget -P images/ "https://raw.githubusercontent.com/Vinihcampos/dim0451_DIP/master/Exercise%233/images/trump.jpg"
    !wget -P images/ "https://raw.githubusercontent.com/Vinihcampos/dim0451_DIP/master/Exercise%233/images/wartortle.png"
    !wget -P images/ "https://raw.githubusercontent.com/Vinihcampos/dim0451_DIP/master/Exercise%233/images/pikachu.jpg"

Ideal filters

In [2]:
def ideal_lowpass(img, d0):
    h,w = img.shape
    
    img_fft = np.fft.fft2(img)    
    img_fft = np.fft.fftshift(img_fft)
    
    for row in range(h):
        for col in range(w):
            du = row - h / 2
            dv = col - w / 2
            if sqrt( du**2 + dv**2 ) > d0:
                img_fft[row,col] = 0
    
    img_fft = np.fft.fftshift(img_fft)
    real_img = np.fft.ifft2(img_fft).astype('int')
    return real_img

def ideal_highpass(img, d0):
    h,w = img.shape
    
    img_fft = np.fft.fft2(img)
    img_fft = np.fft.fftshift(img_fft)
    
    for row in range(h):
        for col in range(w):
            du = row - h / 2
            dv = col - w / 2
            if sqrt( du**2 + dv**2 ) <= d0:
                img_fft[row,col] = 0
                
    img_fft = np.fft.fftshift(img_fft)
    real_img = np.fft.ifft2(img_fft).astype('int')
    return real_img

Buttwerworth filters

In [3]:
def lowpass_butterworth(img, d0, n = 1):
    h,w = img.shape
    
    img_fft = np.fft.fft2(img)    
    img_fft = np.fft.fftshift(img_fft)
    
    for row in range(h):
        for col in range(w):
            du = row - h / 2
            dv = col - w / 2
            root = sqrt( du**2 + dv**2 )
            if d0 != 0:
                img_fft[row,col] *= 1.0 / sqrt( 1.0 + (root / d0) ** (2*n) )
    
    img_fft = np.fft.fftshift(img_fft)
    real_img = np.abs(np.fft.ifft2(img_fft)).astype('int')
    return real_img

def highpass_butterworth(img, d0, n = 1):
    h,w = img.shape
    
    img_fft = np.fft.fft2(img)    
    img_fft = np.fft.fftshift(img_fft)
    
    for row in range(h):
        for col in range(w):
            du = row - h / 2
            dv = col - w / 2
            root = sqrt( du**2 + dv**2 )
            if root != 0:
                img_fft[row,col] *= 1.0 / sqrt( 1.0 + (d0 / root) ** (2*n) )
    
    img_fft = np.fft.fftshift(img_fft)
    real_img = np.abs(np.fft.ifft2(img_fft)).astype('int')
    return real_img

Spatial filters

In [4]:
def blur(img, size):
    h,w = img.shape
    
    img_fft = np.fft.fft2(img)
    kernel = np.zeros(img.shape)
    
    for row in range(size):
        for col in range(size):
            kernel[row,col] = 1.0 / (size*size)
    
    kernel = np.fft.fft2(kernel)
    img_result = kernel * img_fft    
    
    real_img = np.fft.ifft2(img_result).astype('int')
    return real_img

def laplacian(img):
    h,w = img.shape
    
    img_fft = np.fft.fft2(img)
    kernel = np.zeros(img.shape)
    kernel[0,1] = -1
    kernel[2,1] = -1
    kernel[1,0] = -1
    kernel[1,2] = -1
    kernel[1,1] = 4
    
    kernel = np.fft.fft2(kernel)
    img_result = kernel * img_fft    
    
    real_img = np.fft.ifft2(img_result).astype('int')
    return real_img

def sobelx(img):
    h,w = img.shape
    
    img_fft = np.fft.fft2(img)
    kernel = np.zeros(img.shape)
    kernel[0,0] = -1
    kernel[1,0] = -2
    kernel[2,0] = -1
    kernel[0,2] = 1
    kernel[1,2] = 2
    kernel[2,2] = 1
    
    kernel = np.fft.fft2(kernel)
    img_result = kernel * img_fft    
    
    real_img = np.fft.ifft2(img_result).astype('int')
    return real_img
In [5]:
trump = cv2.imread('images/trump.jpg', 0)
hillary = cv2.imread('images/hillary.jpg', 0)
hillary = cv2.resize(hillary, (220,304))

plt.figure(figsize=(15,10))
ax1 = plt.subplot(121)
ax1.imshow(trump, cmap='gray')
ax2 = plt.subplot(122)
ax2.imshow(hillary, cmap='gray')

ax1.axis('off')
ax2.axis('off')

ax1.text(0.5,-0.1, "trump: " + str(trump.shape), ha="center", transform=ax1.transAxes)
ax2.text(0.5,-0.1, "hillary: " + str(hillary.shape), ha="center", transform=ax2.transAxes)

plt.show()
In [6]:
trump_low = lowpass_butterworth(trump, 20, 10)
trump_high = highpass_butterworth(trump, 20, 10)
trump_low_ideal = ideal_lowpass(trump, 20)
trump_high_ideal = ideal_highpass(trump, 20)

hillary_low = lowpass_butterworth(hillary, 20, 10)
hillary_high = highpass_butterworth(hillary, 20, 10)
hillary_low_ideal = ideal_lowpass(hillary, 20)
hillary_high_ideal = ideal_highpass(hillary, 20)

plt.figure(figsize=(15,10))
ax1 = plt.subplot(241)
ax1.imshow(trump_low, cmap='gray')
ax2 = plt.subplot(242)
ax2.imshow(trump_high, cmap='gray')
ax3 = plt.subplot(243)
ax3.imshow(hillary_low, cmap='gray')
ax4 = plt.subplot(244)
ax4.imshow(hillary_high, cmap='gray')
ax5 = plt.subplot(245)
ax5.imshow(trump_low_ideal, cmap='gray')
ax6 = plt.subplot(246)
ax6.imshow(trump_high_ideal, cmap='gray')
ax7 = plt.subplot(247)
ax7.imshow(hillary_low_ideal, cmap='gray')
ax8 = plt.subplot(248)
ax8.imshow(hillary_high_ideal, cmap='gray')

ax1.axis('off')
ax2.axis('off')
ax3.axis('off')
ax4.axis('off')
ax5.axis('off')
ax6.axis('off')
ax7.axis('off')
ax8.axis('off')

plt.show()
/home/vinihcampos/miniconda3/envs/dip/lib/python3.7/site-packages/ipykernel_launcher.py:15: ComplexWarning: Casting complex values to real discards the imaginary part
  from ipykernel import kernelapp as app
/home/vinihcampos/miniconda3/envs/dip/lib/python3.7/site-packages/ipykernel_launcher.py:32: ComplexWarning: Casting complex values to real discards the imaginary part
In [7]:
trump_hillary = trump_low + hillary_high
hillary_trump = hillary_low + trump_high

trump_hillary_ideal = trump_low_ideal + hillary_high_ideal
hillary_trump_ideal = hillary_low_ideal + trump_high_ideal

trump_hillary = ((trump_hillary - trump_hillary.min())/(trump_hillary.max() - trump_hillary.min())*255 )
hillary_trump = ((hillary_trump - hillary_trump.min())/(hillary_trump.max() - hillary_trump.min())*255 )
trump_hillary_ideal = ((trump_hillary_ideal - trump_hillary_ideal.min())/(trump_hillary_ideal.max() - trump_hillary_ideal.min())*255 )
hillary_trump_ideal = ((hillary_trump_ideal - hillary_trump_ideal.min())/(hillary_trump_ideal.max() - hillary_trump_ideal.min())*255 )

plt.figure(figsize=(20,10))
ax1 = plt.subplot(141)
ax1.imshow(trump_hillary, cmap='gray')
ax2 = plt.subplot(142)
ax2.imshow(hillary_trump, cmap='gray')
ax3 = plt.subplot(143)
ax3.imshow(trump_hillary_ideal, cmap='gray')
ax4 = plt.subplot(144)
ax4.imshow(hillary_trump_ideal, cmap='gray')
ax1.axis('off')
ax2.axis('off')
ax3.axis('off')
ax4.axis('off')
plt.show()

cv2.imwrite('results/trump_hillary.jpg', trump_hillary)
cv2.imwrite('results/hillary_trump.jpg', hillary_trump)
cv2.imwrite('results/trump_hillary_ideal.jpg', trump_hillary_ideal)
cv2.imwrite('results/hillary_trump_ideal.jpg', hillary_trump_ideal)

plt.figure(figsize=(4, 4))
ax1 = plt.subplot(141)
ax1.imshow(trump_hillary, cmap='gray')
ax2 = plt.subplot(142)
ax2.imshow(hillary_trump, cmap='gray')
ax3 = plt.subplot(143)
ax3.imshow(trump_hillary_ideal, cmap='gray')
ax4 = plt.subplot(144)
ax4.imshow(hillary_trump_ideal, cmap='gray')
ax1.axis('off')
ax2.axis('off')
ax3.axis('off')
ax4.axis('off')
plt.show()

More examples

In [8]:
ted = cv2.imread('images/ted.jpg', 0)
ted = cv2.resize(ted, (220,304))

plt.figure(figsize=(15,10))
ax1 = plt.subplot(121)
ax1.imshow(trump, cmap='gray')
ax2 = plt.subplot(122)
ax2.imshow(ted, cmap='gray')

ax1.axis('off')
ax2.axis('off')

ax1.text(0.5,-0.1, "trump: " + str(trump.shape), ha="center", transform=ax1.transAxes)
ax2.text(0.5,-0.1, "ted: " + str(ted.shape), ha="center", transform=ax2.transAxes)

plt.show()
In [9]:
trump_low = lowpass_butterworth(trump, 20, 10)
trump_high = highpass_butterworth(trump, 20, 10)
trump_low_ideal = ideal_lowpass(trump, 20)
trump_high_ideal = ideal_highpass(trump, 20)

ted_low = lowpass_butterworth(ted, 20, 10)
ted_high = highpass_butterworth(ted, 20, 10)
ted_low_ideal = ideal_lowpass(ted, 20)
ted_high_ideal = ideal_highpass(ted, 20)

plt.figure(figsize=(15,10))
ax1 = plt.subplot(241)
ax1.imshow(trump_low, cmap='gray')
ax2 = plt.subplot(242)
ax2.imshow(trump_high, cmap='gray')
ax3 = plt.subplot(243)
ax3.imshow(ted_low, cmap='gray')
ax4 = plt.subplot(244)
ax4.imshow(ted_high, cmap='gray')
ax5 = plt.subplot(245)
ax5.imshow(trump_low_ideal, cmap='gray')
ax6 = plt.subplot(246)
ax6.imshow(trump_high_ideal, cmap='gray')
ax7 = plt.subplot(247)
ax7.imshow(ted_low_ideal, cmap='gray')
ax8 = plt.subplot(248)
ax8.imshow(ted_high_ideal, cmap='gray')

ax1.axis('off')
ax2.axis('off')
ax3.axis('off')
ax4.axis('off')
ax5.axis('off')
ax6.axis('off')
ax7.axis('off')
ax8.axis('off')

plt.show()
/home/vinihcampos/miniconda3/envs/dip/lib/python3.7/site-packages/ipykernel_launcher.py:15: ComplexWarning: Casting complex values to real discards the imaginary part
  from ipykernel import kernelapp as app
/home/vinihcampos/miniconda3/envs/dip/lib/python3.7/site-packages/ipykernel_launcher.py:32: ComplexWarning: Casting complex values to real discards the imaginary part
In [10]:
trump_ted = trump_low + ted_high
ted_trump = ted_low + trump_high
trump_ted_ideal = trump_low_ideal + ted_high_ideal
ted_trump_ideal = ted_low_ideal + trump_high_ideal

trump_ted = ((trump_ted - trump_ted.min())/(trump_ted.max() - trump_ted.min())*255 )
ted_trump = ((ted_trump - ted_trump.min())/(ted_trump.max() - ted_trump.min())*255 )
trump_ted_ideal = ((trump_ted_ideal - trump_ted_ideal.min())/(trump_ted_ideal.max() - trump_ted_ideal.min())*255 )
ted_trump_ideal = ((ted_trump_ideal - ted_trump_ideal.min())/(ted_trump_ideal.max() - ted_trump_ideal.min())*255 )

plt.figure(figsize=(20,10))
ax1 = plt.subplot(141)
ax1.imshow(trump_ted, cmap='gray')
ax2 = plt.subplot(142)
ax2.imshow(ted_trump, cmap='gray')
ax3 = plt.subplot(143)
ax3.imshow(trump_ted_ideal, cmap='gray')
ax4 = plt.subplot(144)
ax4.imshow(ted_trump_ideal, cmap='gray')
ax1.axis('off')
ax2.axis('off')
ax3.axis('off')
ax4.axis('off')

plt.show()

cv2.imwrite('results/trump_ted.jpg', trump_ted)
cv2.imwrite('results/ted_trump.jpg', ted_trump)
cv2.imwrite('results/trump_ted_ideal.jpg', trump_ted_ideal)
cv2.imwrite('results/ted_trump_ideal.jpg', ted_trump_ideal)

plt.figure(figsize=(4,4))
ax1 = plt.subplot(141)
ax1.imshow(trump_ted, cmap='gray')
ax2 = plt.subplot(142)
ax2.imshow(ted_trump, cmap='gray')
ax3 = plt.subplot(143)
ax3.imshow(trump_ted_ideal, cmap='gray')
ax4 = plt.subplot(144)
ax4.imshow(ted_trump_ideal, cmap='gray')
ax1.axis('off')
ax2.axis('off')
ax3.axis('off')
ax4.axis('off')
plt.show()
In [11]:
dog = cv2.imread('images/dog.jpg', 0)
cat = cv2.imread('images/cat.jpg', 0)
cat = cv2.flip(cat,1)
cat = cv2.resize(cat, (390,280))

plt.figure(figsize=(15,10))
ax1 = plt.subplot(121)
ax1.imshow(dog, cmap='gray')
ax2 = plt.subplot(122)
ax2.imshow(cat, cmap='gray')

ax1.axis('off')
ax2.axis('off')

ax1.text(0.5,-0.1, "dog: " + str(dog.shape), ha="center", transform=ax1.transAxes)
ax2.text(0.5,-0.1, "cat: " + str(cat.shape), ha="center", transform=ax2.transAxes)

plt.show()
In [12]:
dog_low = blur(dog, 11)
dog_high_laplacian = laplacian(dog)
dog_high_sobel = sobelx(dog)

cat_low = blur(cat, 11)
cat_high_laplacian = laplacian(cat)
cat_high_sobel = sobelx(cat)

plt.figure(figsize=(20,10))
ax1 = plt.subplot(231)
ax1.imshow(dog_low, cmap='gray')
ax2 = plt.subplot(232)
ax2.imshow(dog_high_laplacian, cmap='gray')
ax3 = plt.subplot(233)
ax3.imshow(dog_high_sobel, cmap='gray')
ax4 = plt.subplot(234)
ax4.imshow(cat_low, cmap='gray')
ax5 = plt.subplot(235)
ax5.imshow(cat_high_laplacian, cmap='gray')
ax6 = plt.subplot(236)
ax6.imshow(cat_high_sobel, cmap='gray')

ax1.axis('off')
ax2.axis('off')
ax3.axis('off')
ax4.axis('off')
ax5.axis('off')
ax6.axis('off')

plt.show()
/home/vinihcampos/miniconda3/envs/dip/lib/python3.7/site-packages/ipykernel_launcher.py:14: ComplexWarning: Casting complex values to real discards the imaginary part
  
/home/vinihcampos/miniconda3/envs/dip/lib/python3.7/site-packages/ipykernel_launcher.py:31: ComplexWarning: Casting complex values to real discards the imaginary part
/home/vinihcampos/miniconda3/envs/dip/lib/python3.7/site-packages/ipykernel_launcher.py:49: ComplexWarning: Casting complex values to real discards the imaginary part
In [13]:
dog_cat_laplacian = dog_low + cat_high_laplacian
cat_dog_laplacian = cat_low + dog_high_laplacian

dog_cat_sobel = dog_low + cat_high_sobel
cat_dog_sobel = cat_low + dog_high_sobel

dog_cat_laplacian = ((dog_cat_laplacian - dog_cat_laplacian.min())/(dog_cat_laplacian.max() - dog_cat_laplacian.min())*255 )
cat_dog_laplacian = ((cat_dog_laplacian - cat_dog_laplacian.min())/(cat_dog_laplacian.max() - cat_dog_laplacian.min())*255 )
dog_cat_sobel = ((dog_cat_sobel - dog_cat_sobel.min())/(dog_cat_sobel.max() - dog_cat_sobel.min())*255 )
cat_dog_sobel = ((cat_dog_sobel - cat_dog_sobel.min())/(cat_dog_sobel.max() - cat_dog_sobel.min())*255 )

plt.figure(figsize=(20,10))
ax1 = plt.subplot(141)
ax1.imshow(dog_cat_laplacian, cmap='gray')
ax2 = plt.subplot(142)
ax2.imshow(cat_dog_laplacian, cmap='gray')
ax3 = plt.subplot(143)
ax3.imshow(dog_cat_sobel, cmap='gray')
ax4 = plt.subplot(144)
ax4.imshow(cat_dog_sobel, cmap='gray')
ax1.axis('off')
ax2.axis('off')
ax3.axis('off')
ax4.axis('off')

plt.show()

cv2.imwrite('results/dog_cat_laplacian.jpg', dog_cat_laplacian)
cv2.imwrite('results/dog_cat_sobel.jpg', dog_cat_sobel)
cv2.imwrite('results/cat_dog_laplacian.jpg', cat_dog_laplacian)
cv2.imwrite('results/cat_dog_sobel.jpg', cat_dog_sobel)

plt.figure(figsize=(4,4))
ax1 = plt.subplot(141)
ax1.imshow(dog_cat_laplacian, cmap='gray')
ax2 = plt.subplot(142)
ax2.imshow(cat_dog_laplacian, cmap='gray')
ax3 = plt.subplot(143)
ax3.imshow(dog_cat_sobel, cmap='gray')
ax4 = plt.subplot(144)
ax4.imshow(cat_dog_sobel, cmap='gray')
ax1.axis('off')
ax2.axis('off')
ax3.axis('off')
ax4.axis('off')
plt.show()

Mixed method

In [14]:
def ideal_filters(img1, img2, d0):
    h,w = img1.shape
    
    fft1 = np.fft.fft2(img1)    
    fft2 = np.fft.fft2(img2)
    fft1 = np.fft.fftshift(fft1)
    fft2 = np.fft.fftshift(fft2)
    
    for row in range(h):
        for col in range(w):
            du = row - h / 2
            dv = col - w / 2
            if sqrt( du**2 + dv**2 ) > d0:
                fft1[row,col] = 0
            else:
                fft2[row,col] = 0
    
    result = fft1 + fft2    
    result = np.fft.fftshift(result)    
    real_img = np.fft.ifft2(result).astype('int')
    
    return real_img
In [15]:
wartortle = cv2.imread('images/wartortle.png', 0)
raichu = cv2.imread('images/raichu.png', 0)
raichu = cv2.resize(raichu, (400,300))

plt.figure(figsize=(15,10))
ax1 = plt.subplot(121)
ax1.imshow(raichu, cmap='gray')
ax2 = plt.subplot(122)
ax2.imshow(wartortle, cmap='gray')

ax1.axis('off')
ax2.axis('off')

ax1.text(0.5,-0.1, "raichu: " + str(raichu.shape), ha="center", transform=ax1.transAxes)
ax2.text(0.5,-0.1, "wartortle: " + str(wartortle.shape), ha="center", transform=ax2.transAxes)

plt.show()
In [16]:
raichu_wartortle = ideal_filters(raichu,wartortle, 20)
wartortle_raichu = ideal_filters(wartortle,raichu, 20)

raichu_wartortle = ((raichu_wartortle - raichu_wartortle.min())/(raichu_wartortle.max() - raichu_wartortle.min())*255 )
wartortle_raichu = ((wartortle_raichu - wartortle_raichu.min())/(wartortle_raichu.max() - wartortle_raichu.min())*255 )

cv2.imwrite('results/raichu_wartortle.png', raichu_wartortle)
cv2.imwrite('results/wartortle_raichu.png', wartortle_raichu)

plt.figure(figsize=(15,10))
ax1 = plt.subplot(121)
ax1.imshow(raichu_wartortle, cmap='gray')
ax2 = plt.subplot(122)
ax2.imshow(wartortle_raichu, cmap='gray')
ax1.axis('off')
ax2.axis('off')

plt.figure(figsize=(2,2))
ax1 = plt.subplot(121)
ax1.imshow(raichu_wartortle, cmap='gray')
ax2 = plt.subplot(122)
ax2.imshow(wartortle_raichu, cmap='gray')
ax1.axis('off')
ax2.axis('off')
/home/vinihcampos/miniconda3/envs/dip/lib/python3.7/site-packages/ipykernel_launcher.py:20: ComplexWarning: Casting complex values to real discards the imaginary part
Out[16]:
(-0.5, 399.5, 299.5, -0.5)
In [17]:
def butterworth_filters(img1, img2, d0, n = 1):
    h,w = img1.shape
    
    fft1 = np.fft.fft2(img1)    
    fft2 = np.fft.fft2(img2)
    fft1 = np.fft.fftshift(fft1)
    fft2 = np.fft.fftshift(fft2)
    
    for row in range(h):
        for col in range(w):
            du = row - h / 2
            dv = col - w / 2
            root = sqrt( du**2 + dv**2 )
            if d0 != 0:
                fft1[row,col] *= 1.0 / sqrt( 1.0 + (root / d0) ** (2*n) )
            if root != 0:
                fft2[row,col] *= 1.0 / sqrt( 1.0 + (d0 / root) ** (2*n) )
    
    result = fft1 + fft2    
    result = np.fft.fftshift(result)    
    real_img = np.fft.ifft2(result).astype('int')
    
    return real_img
In [18]:
pikachu = cv2.imread('images/pikachu.jpg', 0)
raichu = cv2.imread('images/raichu.png', 0)
pikachu = cv2.resize(pikachu, (800,600))

plt.figure(figsize=(15,10))
ax1 = plt.subplot(121)
ax1.imshow(raichu, cmap='gray')
ax2 = plt.subplot(122)
ax2.imshow(pikachu, cmap='gray')

ax1.axis('off')
ax2.axis('off')

ax1.text(0.5,-0.1, "raichu: " + str(raichu.shape), ha="center", transform=ax1.transAxes)
ax2.text(0.5,-0.1, "pikachu: " + str(pikachu.shape), ha="center", transform=ax2.transAxes)

plt.show()
In [19]:
pikachu_wartortle = butterworth_filters(raichu,pikachu, 20, 10)
wartortle_pikachu = butterworth_filters(pikachu,raichu, 20, 10)

pikachu_wartortle = ((pikachu_wartortle - pikachu_wartortle.min())/(pikachu_wartortle.max() - pikachu_wartortle.min())*255 )
wartortle_pikachu = ((wartortle_pikachu - wartortle_pikachu.min())/(wartortle_pikachu.max() - wartortle_pikachu.min())*255 )

cv2.imwrite('results/pikachu_wartortle.png', pikachu_wartortle)
cv2.imwrite('results/wartortle_pikachu.png', wartortle_pikachu)

plt.figure(figsize=(15,10))
ax1 = plt.subplot(121)
ax1.imshow(pikachu_wartortle, cmap='gray')
ax2 = plt.subplot(122)
ax2.imshow(wartortle_pikachu, cmap='gray')
ax1.axis('off')
ax2.axis('off')

plt.figure(figsize=(2,2))
ax1 = plt.subplot(121)
ax1.imshow(pikachu_wartortle, cmap='gray')
ax2 = plt.subplot(122)
ax2.imshow(wartortle_pikachu, cmap='gray')
ax1.axis('off')
ax2.axis('off')
/home/vinihcampos/miniconda3/envs/dip/lib/python3.7/site-packages/ipykernel_launcher.py:21: ComplexWarning: Casting complex values to real discards the imaginary part
Out[19]:
(-0.5, 799.5, 599.5, -0.5)